DEVICE SERCOM

0.1 Introduction

The SERCOM device is a tool established in the CPU that allows to transmit and receive data via serial communication ports. The received data are stored in a buffer of adjustable size. Also receiving can be adjusted automatically by the application of the XON-XOFF protocol. To transmit data using fixed memory area formed by 64 byte. Since that receive and send buffers are different, you can create a shortcut both Half-Duplex and Full-Duplex links.
Using the capabilities of the low level of this device you can implement in your QCL code the highest level communication protocol allowing serial communication with different equipment (example: bar-code reader, linear position sensors with serial data transmission, small printer, ecc.).

0.2 Installation

0.2.1 Device declaration in the configuration file (.CNF)

Declaration of the used device (internal device): device name assigned, SERCOM, sampling time, serial port, size of receive buffer.

;-------------------------------
;Internal device declaration
;-------------------------------
INTDEVICE
...
<device_name>         SERCOM TCamp serial_port dim_buffer_rx
...

Where:

INTDEVICEis a keyword indicating the beginning of the definition of internal devices,
<device_nameis the device name,
SERCOMis the keyword that identifies the device described in this document,
TCampis the sampling time of the device,
serial_portis the definition of the type of serial port connected (0 = Prog, 1 = User, the ID
number of the other serial portsdepends on the hardware and firmware of the instrument used).
dim_buffer_rxis the number of bytes to use for the receive circular buffer. If the number
is omitted from the X character, or is less than the minimum of 48,
It is set to the minimum value. The maximum value allowed is 32000.

The Declaration of the hardware used in the “BUS” section of the configuration unit you will have to refer to the firmware of the hardware itself.

Example
;-------------------------------
;Internal device declaration
;-------------------------------
INTDEVICE
...
DevSer       SERCOM         0001   0000   0100
...

0.3 Receive and send buffer

The receive and transmit buffers are distinguished, you can then make an Half-Duplex and Full-Duplex connections.

0.3.1 Receive buffer

The receive buffer is a memory FIFO type (First Input First Output). The device provides a parameter (ibyte1 ), in response to a command (RECEIVED), the first data received. There is also a parameter that contains the number of received data and in the buffer ( nrx ). With this informations it is easy to write a program in QCL which might “empty” the buffer as arriving data.
The buffer is “circular”: once you run out of space destined to receive subsequent data go to overwrite previously received (if you don't use the XON-XOFF). The latter event is reported in the err parameter.
The receive buffer size can be set in the configuration file at the time of the device declaration. It's important to correctly adjust the receive buffer to prevent the data loss. For example, if a instrument normally broadcasts a 100 characters string and the buffer has a capacity to store 50 characters, or stops the transmission of the string or you lose the data. If the transmitter instrument manages the XON-XOFF protocol the device interrupts its transmission by sending the XOFF character, reactivating the XON character when buffer space is freed.

0.3.2 Transmission buffer

The transmit buffer is fixed-size. It is composed from variables “obyteNN”, with NN from 1 to 64. In the case of the transmission you can write every single byte in transmission. With a single command ( SEND ) you will be able to transfer a message consisting of a ntx number of byte (up to 64 max). If this is not sufficient, it's always possible to transmit multiple consecutive packets to complete the message. The use of a subsequent packets require the receiving system does not time-out may be turned on receiving between a character and the next (see section “Limitations”).

0.3.3 Flow control

The device uses a software flow control, composed from send/receive of two characters (XOn and XOff) enhance enable or temporarily block the transmission of the external device to the Qmove to allow the processing of data already received and emptying buffer. Flow control can be enabled as an automatic feature to avoid filling the receive buffer.
The threshold of XOn and XOff are respectively set by the parameters: xonlim and xofflim.

0.4 Commands and parameters table

0.4.1 Simbologia adottata

Il nome del parametro, stato o comando viene riportato alla sinistra della tabella.

R
Indica se il relativo parametro o stato è ritentivo (al momento dell’inizializzazione del device mantiene lo stato precedentemente definito), oppure lo stato che assume al momento dell’inizializzazione del device.
Se il device non necessita di inizializzazione il campo “R” indica il valore che il parametro o stato assume all’accensione della scheda.
R = Ritentivo
0 = Al momento dell’inizializzazione del device il valore viene forzato a zero.
1 = Al momento dell’inizializzazione del device il valore viene forzato a uno.
- = Al momento dell’inizializzazione del device viene presentato il valore significativo.

D
Indica la dimensione del parametro.
F = Flag
B = Byte
W = Word
L = Long
S = Single Float

0.4.1.1 Condizioni

Vengono descritte tutte le condizioni necessarie affinché il parametro sia considerato corretto o perché il comando venga accettato.
In alcuni casi vengono specificati dei valori limite per l’accettazione del parametro: se vengono introdotti dei valori esterni ai limiti impostati, il dato viene comunque accettato; pertanto devono essere previsti opportuni controlli dell’applicativo tali da garantire il corretto funzionamento.
Per l’esecuzione di un comando, tutte le relative condizioni devono necessariamente essere soddisfatte; in caso contrario il comando non viene eseguito.

A
Indica la modalità di accesso.
R = Read (lettura).
W = Write (scrittura).
RW = Read / Write.

0.4.2 Comandi

I comandi a disposizione per gestire il device sono elencati sotto l'ordine di priorità decrescente. Il device esegue tutti i comandi ricevuti entro lo stesso tempo di campionamento iniziando da quello con la priorità maggiore. Per esempio se il device riceve nello stesso tempo di campionamento i comandi CLOSECOM e OPENCOM, per primo esegue il comando OPENCOM e poi quello di CLOSECOM lasciando perciò la porta di comunicazione chiusa.

NomeDRACondizioniDescrizione
OPENCOM / / / st_opencom = 0Open Serial communication
Apre la comunicazione seriale (il device quindi impegna la porta di comunicazione ).
Lo stato st_opencom diventa 1.
CLOSECOM / / / / Close Serial communication
Chiude la comunicazione seriale (il device quindi non impegna piú la porta di comunicazione ).
Lo stato st_opencom diventa 0.
SEND / / / ntx > 0
st_opencom = 1
Send
Invia la stringa composta nel buffer di trasmissione per il numero di caratteri impostati nel parametro “ntx”.
RECEIVED / / / ntx > 0
st_opencom = 1
Received
Se “ nrx ” > 0, preleva il primo carattere ricevuto e lo pone in “ibyte1”, quindi decrementa di 1 la variabile “ nrx“.
FLUSH / / / st_opencom = 1FLush buffer
Esegue un azzeramento della variabile “nrx”, resetta gli stati “st_rxoff” e “st_txoff” e azzera la variabile “ibyte1” e tutto il buffer di trasmissione “obyte1-64”.
CLRWDATA / / / / Clear Warning Data
Azzera la segnalazione del parametro wdata.
CLRWCMD / / / / Clear Warning Command
Azzera la segnalazione del parametro wcmd.

0.4.3 Parametri

NomeDRACondizioniDescrizione
modeBRRW - Mode
Definisce il modo di funzionamento del device come:
0 = Normale, senza controllo di flusso
1 = Controllo di flusso software (Xon - Xoff)
2 = Modo speciale per velocizzare l'estrazione dei caratteri dal buffer. Al comando RECEIVED i caratteri ricevuti vengono presentati nei parametri obyte1÷64 invece che nel parametro ibyte. Questo nuovo modo non supporta l'XO-XOFF (quindi riprende il funzionamento del mode 0).
Range valido: 0 ÷ 2.
N.B.: la modifica del modo di funzionamento, possibile in qualsiasi momento, porta alla reinizializzazione del device con conseguente azzeramento del buffer di ricezione
brateLRRW - Baud rate
Baud rate della seriale.
Valori validi: 4800, 9600, 19200, 38400, 57600.
databBRRW - Data bit Valori validi: 7, 8
stopbBRRW - Stop bit Valori validi: 1, 2
parBRRW - Parity (0 ÷ 2)
0 = none (nessuna),
1 = even (pari),
2 = odd (dispari).
xonlimWRRW - XOn threshold
E’ il valore che identifica la soglia di XOn. Quando il parametro nrx è minore di questa soglia viene inviato un carattere di XON all’unità esterna collegata. Il valore di default è 16. Si deve impostare xonlim minore di xofflim. Se non viene soddisfatta questa condizione, viene forzato il valore di default pari a 16.
xofflimWRRW - XOff threshold
E’ il valore che identifica la soglia di XOff. Quando il parametro nrx è maggiore di questa soglia viene inviato un carattere di XOFF all’unità esterna collegata. Il valore di default è 16. Si deve impostare xofflim maggiore di xonlim. Se non viene soddisfatta questa condizione, viene forzato il valore di default pari a “dimensione buffer” - 16.
ntxW0RW - Number Trasmitted Bytes (1 ÷ 64)
E’ il numero di caratteri da inviare con il comando SEND.
nrxW0R - Number Received Bytes (1 ÷ max.dim. buffer rx)
È il numero di caratteri ricevuti dal buffer seriale.
ibyte1B0R - Rappresenta il buffer di ricezione
In seguito al comando RECEIVED in questo parametro viene caricato il primo byte ricevuto estratto dal buffer di ricezione.
obyte1÷64B0RW - Rappresenta il buffer di trasmissione
Output byte n.1÷64. Sono i 64 byte che compongono il buffer di trasmissione.
err - - - - Errors
Indica se sono stati riscontrati errori nel protocollo.
0 = nessun errore
1 = overflow buffer ricezione; indica che sono stati ricevuti più caratteri rispetto alla capienza del buffer.
serr - - - - Serial Errors
Indica se sono stati riscontrati errori nella comunicazione seriale.
Il parametro viene aggiornato ad ogni errore rilevato.
Il valore permane fino ad un successivo errore o ad una scrittura sullo stesso con il QCL.
0 = nessun errore
1 = parity error
2 = framing error
3 = overrun error
st_sendedF0R - Sended
L'attivazione indica il completamento della trasmissione di un messaggio. Lo stato viene resettato con il comando SEND.
st_rxoffF0Rmode = 1XOff on receive
Se mode = 1 indica che il sistema è in XOff nella ricezione perché il numero di dati contenuti nel buffer di ricezione è sceso al di sotto della soglia di controllo.
Viene resettato automaticamente quando viene inviato il carattere di XOn dopo che il buffer di ricezione è stato “svuotato” con il comando RECEIVED fino al rientro nella soglia di controllo, o con il comando FLUSH.
st_txoffF0R - Flow control XOff
Se mode = 1 indica che il sistema ha ricevuto il carattere di XOff durante una trasmissione.
Viene resettato automaticamente quando viene ricevuto il carattere di XOn o con il comando FLUSH.
wdataF0R - Warning Data
Questo bit segnala che è stato tentato un inserimento di un valore non valido in un parametro.
wcmdF0R - Warning Command
Questo bit segnala che è non è stato eseguito un comando perchè mancano le condizioni necessarie
st_opencomF0R - Open communication port
L'attivazione indica che il device sta impegnando la porta di comunicazione seriale. Per settare questo stato usare il comando OPENCOM, per resettarlo CLOSECOM.

0.5 Limitazioni

Di seguito vengono elencate alcune limitazioni sull’utilizzo del device SERCOM:

Di seguito uno schema delle combinazioni:

DataBitsStopBitsParityBit
Combinazioni NON Funzionanti710
711
712
720
721
722
820
821
822

0.6 Esempio applicativo

Di seguito si riportano alcuni esempi su come utilizzare il device.
Negli esempi il nome del device sarà DevSer.

0.6.1 Trasmissione di una stringa

Trasmissione di una stringa di controllo in formato ASCII verso uno strumento serie DIN HB237.04A.

La stringa da trasmettere è: {13QL1234561000@

Il codice da scrivere è il seguente:

DevSer:mode = 0
...
address = 13
quota = 123456
...
DevSer:obyte1 = 123               ; carattere {
tmp = address
tmp1 = tmp / 10
DevSer:obyte2 = tmp1 + 48         ; carattere 1
tmp = tmp - (tmp1 * 10)
DevSer:obyte3 = tmp + 48          ; carattere 3
DevSer:obyte4 = 81                ; carattere Q
DevSer:obyte5 = 76                ; carattere L
tmp = quota
tmp1 = tmp / 100000
DevSer:obyte6 = tmp1 + 48         ; carattere 1
tmp = tmp - (tmp1 * 100000)
tmp1 = tmp / 10000
DevSer:obyte7 = tmp1 + 48         ; carattere 2
tmp = tmp - (tmp1 * 10000)
tmp1 = tmp / 1000
DevSer:obyte8 = tmp1 + 48         ; carattere 3
tmp = tmp - (tmp1 * 1000)
tmp1 = tmp / 100
DevSer:obyte9 = tmp1 + 48         ; carattere 4
tmp = tmp - (tmp1 * 100)
tmp1 = tmp / 10
DevSer:obyte10 = tmp1 + 48        ; carattere 5
tmp = tmp - (tmp1 * 10)
DevSer:obyte11 = tmp1 + 48        ; carattere 6
DevSer:obyte12 = 49               ; carattere 1
DevSer:obyte13 = 48               ; carattere 0
DevSer:obyte14 = 48               ; carattere 0
DevSer:obyte15 = 48               ; carattere 0
DevSer:obyte16 = 64               ; carattere @
 
DevSer:ntx = 16                   ; imposta l'invio di 16 caratteri
 
SEND DevSer                       ; Invia la stringa
WAIT DevSer:st_sended             ; e attendi fine trasmissione

0.6.2 Ricezione di una stringa

Ricezione di una stringa proveniente da uno strumento HB237.04A in formato ASCII e esecuzione dell’eco di ogni carattere ricevuto.

La stringa da ricevere è: [13RS123456123456@

Il codice da scrivere è:

DevSer:mode = 0
sequenza = 0
...
WAIT DevSer:nrx                           ; attendi ricezione carattere
RECEIVED DevSer
DevSer:obyte1 = DevSer:ibyte1             ; esecuzione local echo
DevSer:ntx = 1                            ; imposta l'invio di 1 carattere
SEND DevSer                               ; Invia la stringa
IF sequenza EQ 0
  IF DevSer:ibyte1 EQ 91                  ; verifica carattere [
    indirizzo = 0
    sequenza = 1
  ENDIF
ENDIF
IF sequenza EQ 1
indirizzo = DevSer:ibyte1 * 10
sequenza = 2
ENDIF
IF sequenza EQ 2
  indirizzo = indirizzo + DevSer:ibyte1
  IF indirizzo EQ 13                      ; verifica valore indirizzo
    sequenza = 3
  ELSE
    sequenza = 0
  ENDIF
ENDIF
...
WAIT DevSer:st_sended                     ; attendi fine trasmissione echo